Scroll to navigation

HWLOC-CALC(1) hwloc HWLOC-CALC(1)

NAME

hwloc-calc - Operate on cpu mask strings and objects

SYNOPSIS

hwloc-calc [options] <location1> [<location2> [...] ]

Note that hwloc(7) provides a detailed explanation of the hwloc system and of valid <location> formats; it should be read before reading this man page.

OPTIONS

Use OS/physical indexes instead of logical indexes for both input and output.
Use logical indexes instead of physical/OS indexes for both input and output (default).
Use OS/physical indexes instead of logical indexes for input.
Use logical indexes instead of physical/OS indexes for input (default).
Use OS/physical indexes instead of logical indexes for output.
Use logical indexes instead of physical/OS indexes for output (default, except for cpusets which are always physical).
Interpret both input and output sets as nodesets instead of CPU sets.
Report nodesets instead of CPU sets.
Interpret input sets as nodesets instead of CPU sets.
Report the number of objects of the given type or depth that intersect the CPU set. This is convenient for finding how many cores, NUMA nodes or PUs are available in a machine.

When combined with --nodeset or --nodeset-output, the nodeset is considered instead of the CPU set for finding matching objects. This is useful when reporting the output as a number or set of NUMA nodes.

Find the list of objects of the given type or depth that intersect the CPU set and report the comma-separated list of their indexes instead of the cpu mask string. This may be used for determining the list of objects above or below the input objects.

When combined with --physical, the list is convenient to pass to external tools such as taskset or numactl --physcpubind or --membind. This is different from --largest since the latter requires that all reported objects are strictly included inside the input objects.

When combined with --nodeset or --nodeset-output, the nodeset is considered instead of the CPU set for finding matching objects. This is useful when reporting the output as a number or set of NUMA nodes.

Find the list of objects of type <type2> that intersect the CPU set and report the space-separated list of their hierarchical indexes with respect to <type1>, <type2>, etc. For instance, if package.core is given, the output would be Package:1.Core:2 Package:2.Core:3 if the input contains the third core of the second package and the fourth core of the third package.

Only normal CPU-side object types may be used. NUMA nodes cannot.

Report (in a human readable format) the list of largest objects which exactly include all input objects (by looking at their CPU sets). None of these output objects intersect each other, and the sum of them is exactly equivalent to the input. No largest object is included in the input This is different from --intersect where reported objects may not be strictly included in the input.
Change the field separator in the output. By default, a space is used to separate output objects (for instance when --hierarchical or --largest is given) while a comma is used to separate indexes (for instance when --intersect is given).
Singlify the output to a single CPU.
Only keep the first PU per core in the input locations. If <N> is specified, keep the <N>-th instead, if any. PUs are ordered by physical index during this filtering.
Display CPU set strings in the format recognized by the taskset command-line program instead of hwloc-specific CPU set string format. This option has no impact on the format of input CPU set strings, both formats are always accepted.
Restrict the topology to the given cpuset.
Include objects disallowed by administrative limitations.
Read topology from XML file <file> (instead of discovering the topology on the local machine). If <file> is "-", the standard input is used. XML support must have been compiled in to hwloc for this option to be usable.
Read topology from <directory> instead of discovering the topology of the local machine. On Linux, the directory may contain the topology files gathered from another machine topology with hwloc-gather-topology. On x86, the directory may contain a cpuid dump gathered with hwloc-gather-cpuid.
Simulate a fake hierarchy (instead of discovering the topology on the local machine). If <specification> is "node:2 pu:3", the topology will contain two NUMA nodes with 3 processing units in each of them. The <specification> string must end with a number of PUs.
Enforce the input in the given format, among xml, fsroot, cpuid and synthetic.
Hide non-fatal error messages. It mostly includes locations pointing to non-existing objects.
Verbose output.
Report version and exit.
Display help message and exit.

DESCRIPTION

hwloc-calc generates and manipulates CPU mask strings or objects. Both input and output may be either objects (with physical or logical indexes), CPU lists (with physical or logical indexes), or CPU mask strings (always physically indexed). Input location specification is described in hwloc(7).

If objects or CPU mask strings are given on the command-line, they are combined and a single output is printed. If no object or CPU mask strings are given on the command-line, the program will read the standard input. It will combine multiple objects or CPU mask strings that are given on the same line of the standard input line with spaces as separators. Different input lines will be processed separately.

Command-line arguments and options are processed in order. For instance, it means that changing the type of input indexes with --li or changing the input topology with -i only affects the processing the following arguments.

NOTE: hwloc-calc cannot manipulate NUMA memory node sets. It only manipulates CPU sets, which means it cannot do much about CPU-less NUMA nodes.

NOTE: It is highly recommended that you read the hwloc(7) overview page before reading this man page. Most of the concepts described in hwloc(7) directly apply to the hwloc-calc utility.

EXAMPLES

hwloc-calc's operation is best described through several examples.

To display the (physical) CPU mask corresponding to the second package:


$ hwloc-calc package:1
0x000000f0

To display the (physical) CPU mask corresponding to the third pacakge, excluding its even numbered logical processors:


$ hwloc-calc package:2 ~PU:even
0x00000c00

To combine two (physical) CPU masks:


$ hwloc-calc 0x0000ffff 0xff000000
0xff00ffff

To display the list of logical numbers of processors included in the second package:


$ hwloc-calc --intersect PU package:1
4,5,6,7

To bind GNU OpenMP threads logically over the whole machine, we need to use physical number output instead:


$ export GOMP_CPU_AFFINITY=`hwloc-calc --physical-output --intersect PU all`
$ echo $GOMP_CPU_AFFINITY
0,4,1,5,2,6,3,7

To display the list of NUMA nodes, by physical indexes, that intersect a given (physical) CPU mask:


$ hwloc-calc --physical --intersect NUMAnode 0xf0f0f0f0
0,2

Converting object logical indexes (default) from/to physical/OS indexes may be performed with --intersect combined with either --physical-output (logical to physical conversion) or --physical-input (physical to logical):


$ hwloc-calc --physical-output PU:2 --intersect PU
3
$ hwloc-calc --physical-input PU:3 --intersect PU
2

One should add --nodeset when converting indexes of memory objects to make sure a single NUMA node index is returned on platforms with heterogeneous memory:


$ hwloc-calc --nodeset --physical-output node:2 --intersect node
3
$ hwloc-calc --nodeset --physical-input node:3 --intersect node
2

To display the set of CPUs near network interface eth0:


$ hwloc-calc os=eth0
0x00005555

To display the indexes of packages near PCI device whose bus ID is 0000:01:02.0:


$ hwloc-calc pci=0000:01:02.0 --intersect Package
1

To display the list of per-package cores that intersect the input:


$ hwloc-calc 0x00003c00 --hierarchical package.core
Package:2.Core:1 Package:3.Core:0

To display the (physical) CPU mask of the entire topology except the third package:


$ hwloc-calc all ~package:3
0x0000f0ff

To combine both physical and logical indexes as input:


$ hwloc-calc PU:2 --physical-input PU:3
0x0000000c

To synthetize a set of cores into largest objects on a 2-node 2-package 2-core machine:


$ hwloc-calc core:0 --largest
Core:0
$ hwloc-calc core:0-1 --largest
Package:0
$ hwloc-calc core:4-7 --largest
NUMANode:1
$ hwloc-calc core:2-6 --largest
Package:1 Package:2 Core:6
$ hwloc-calc pack:2 --largest
Package:2
$ hwloc-calc package:2-3 --largest
NUMANode:1

To get the set of first threads of all cores:


$ hwloc-calc core:all.pu:0
$ hwloc-calc --no-smt all

This can also be very useful in order to make GNU OpenMP use exactly one thread per core, and in logical core order:


$ export OMP_NUM_THREADS=`hwloc-calc --number-of core all`
$ echo $OMP_NUM_THREADS
4
$ export GOMP_CPU_AFFINITY=`hwloc-calc --physical-output --intersect PU --no-smt all`
$ echo $GOMP_CPU_AFFINITY
0,2,1,3

RETURN VALUE

Upon successful execution, hwloc-calc displays the (physical) CPU mask string, (physical or logical) object list, or (physical or logical) object number list. The return value is 0.

hwloc-calc will return nonzero if any kind of error occurs, such as (but not limited to): failure to parse the command line.

SEE ALSO

hwloc(7), lstopo(1), hwloc-info(1)

March 30, 2020 2.2.0